package beans;

import pool.*;
import java.util.*;
import java.sql.*;


/**
 * @author Antonin Mozzati
 * @author Yannick Schürter
 */
public class ListeNouvelles {

    private ArrayList<NouvelleBean> listeNouvelles;
    JDCConnectionDriver driver;
    Connection connexion;

    public ListeNouvelles(JDCConnectionDriver driver) throws Exception {
	this.driver = driver;
    }

    // Retourne la liste des utlisateurs actuellement dans la base
    public ArrayList<NouvelleBean> getListeNouvelles() {
	PreparedStatement ps;
	listeNouvelles = new ArrayList<NouvelleBean>();
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);

	    ps = connexion.prepareStatement("SELECT id_nouvelle, id_flux, titreNouvelle,"
		    + " texteNouvelle, dateCreation, statutNouvelle FROM app.nouvelles");
	    ResultSet rs = ps.executeQuery();
	    while (rs.next()) {
		NouvelleBean nouvelle = new NouvelleBean(
			new Integer(rs.getString(1)),
			new Integer(rs.getString(2)),
			new Integer(rs.getString(6)),
			rs.getString(3),
			rs.getString(4),
			rs.getString(5));
		listeNouvelles.add(nouvelle);
	    }
	    ps.close();

	} catch (Exception e) {
	    System.out.println("Pb fermeture: " + e.getMessage());
	    e.printStackTrace();
	}
	return listeNouvelles;
    }

    public int addNouvelle(NouvelleBean nb) {
	try {
	    System.out.println("Connection...");
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	    System.out.println("Connection activée");
	    PreparedStatement ps;
	    System.out.println("Ajout de la nouvelle " + nb.getTitreNouvelle());
	    ps = connexion.prepareStatement("Insert into app.nouvelles (id_flux, titreNouvelle, texteNouvelle, dateCreation, statutNouvelle) VALUES ("
		    + nb.getId_flux() + ", "
		    + "'" + nb.getTitreNouvelle().replace("'", "''") + "', "
		    + "'" + nb.getTexteNouvelle().replace("'", "''") + "', "
		    + "'" + nb.getDateCreation() + "', "
		    + nb.getStatutNouvelle() + ")", Statement.RETURN_GENERATED_KEYS);
	    ps.executeUpdate();

	    // Récupération de l'id de la nouvelle générée à l'insertion
	    ResultSet keys = ps.getGeneratedKeys();
	    keys.next();
	    int insertID = keys.getInt(1);

	    System.out.println("Nouvelle " + nb.getTitreNouvelle() + " ajoutée avec succès.");
	    ps.close();
	    return insertID;
	} catch (Exception e) {
	    e.printStackTrace();
	}
	return 0;
    }

    //pas testé
    public void removeNouvelleByID(int id) {
	try {
	    System.out.println("Connection...");
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	    System.out.println("Connection activée");
	    PreparedStatement ps;
	    System.out.println("Suppresion de la nouvelle" + id);
	    ps = connexion.prepareStatement("DELETE FROM app.nouvelles WHERE ID_NOUVELLE=" + id);
	    ps.executeUpdate();
	    System.out.println("Nouvelle " + id + " retiré avec succès.");
	    ps.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    public NouvelleBean getById(int id_nouvelle) {
	for (NouvelleBean nb : this.getListeNouvelles()) {
	    if (nb.getId_nouvelle() == (id_nouvelle)) {
		System.out.println("Nouvelle " + nb.getId_nouvelle() + " ( " + nb.getTitreNouvelle() + " )");
		return nb;
	    }
	}
	return null;
    }

    public ArrayList<NouvelleBean> getByFlux(int id_flux) {
	ArrayList<NouvelleBean> listeNouvelles = new ArrayList<NouvelleBean>();
	for (NouvelleBean nb : this.getListeNouvelles()) {
	    //System.out.println("NOUVELLE "+nb.getId_nouvelle()+" TROUVEE");
	    if (nb.getId_flux() == (id_flux)) {
		System.out.println("   Nouvelle du flux " + nb.getId_flux());
		if (!listeNouvelles.contains(nb)) {
		    listeNouvelles.add(nb);
		}
	    }
	}
	return listeNouvelles;
    }

    /**
     * @param id_flux
     * @return le nombre de nouvelles contenues dans le flux
     */
    public int getNbByFlux(int id_flux) {
	int res = 0;
	for (NouvelleBean nb : this.getListeNouvelles()) {
	    if (nb.getId_flux() == id_flux) {
		res++;
	    }
	}
	return res;
    }

    /**
     * @param titre
     * @return une liste de nouvelleBean qui contiennent ce titre
     */
    public ArrayList<NouvelleBean> getByTitre(String titre) {
	ArrayList<NouvelleBean> listeNouvelle = new ArrayList<NouvelleBean>();

	for (NouvelleBean nb : this.getListeNouvelles()) {
	    if (nb.getTitreNouvelle() != null) {
		if (nb.getTitreNouvelle().contains(titre)) {
		    listeNouvelle.add(nb);
		}
	    }
	}
	return listeNouvelle;
    }
    
    public ArrayList<NouvelleBean> getByTag(String tag) {
	PreparedStatement ps;
	ArrayList<NouvelleBean> listeNouvelles = new ArrayList<NouvelleBean>();
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);

	    ps = connexion.prepareStatement("SELECT app.nouvelles.* FROM app.nouvelles, app.tags_nouvelles, app.tags_nouvelles_match"
                    + " WHERE app.tags_nouvelles.id_tagnouvelle = app.tags_nouvelles_match.id_tagnouvelle"
                    + " AND app.nouvelles.id_nouvelle = app.tags_nouvelles_match.id_nouvelle"
                    + " AND app.tags_nouvelles.nomtagnouvelle like '%"+tag+"%'");
	    ResultSet rs = ps.executeQuery();
	    while (rs.next()) {
		NouvelleBean nb = new NouvelleBean(
			new Integer(rs.getString(1)),
			new Integer(rs.getString(2)),
			new Integer(rs.getString(6)),
			rs.getString(3),
			rs.getString(4),
			rs.getString(5));
		listeNouvelles.add(nb);
	    }
	    ps.close();

	} catch (Exception e) {
	    System.out.println("Pb fermeture: " + e.getMessage());
	    e.printStackTrace();
	}
	return listeNouvelles;
    }
}
